<?php
// +----------------------------------------------------------------------
// | B5Yii2CMF V3.0 [快捷通用基础管理开发平台]
// +----------------------------------------------------------------------
// | Author: 冰舞 <357145480@qq.com>
// +----------------------------------------------------------------------
declare (strict_types=1);

namespace api\modules\v1\tools;

use common\helpers\Functions;
use Yii;
use yii\helpers\StringHelper;

/**
 * Class TransData
 */
class Trans
{
    private static string $mask = '@H9^cP[';

    /**
     * 对id进行加密
     * @param $id
     * @return string
     */
    public static function idEn($id): string
    {
        if (!$id) return '';
        $index = $id%9; // 为了前端详情使用背景色统一
        $id = (string)$id;
        return $index.self::maskToken($id);
    }

    /**
     * 对id进行解密
     * @param $str
     * @return int
     */
    public static function idDe($str): int
    {
        if (!$str) return 0;
        $result = self::unmaskToken(substr($str,1));
        $result = str_replace('#','', $result);
        if (!$result || !is_numeric($result) || $result < 1) return 0;
        return intval($result);
    }

    /**
     * 转换静态资源
     * @param array|string $file
     * @return string
     */
    public static function file($file): string
    {
        if (!$file) return '';
        $result = Functions::getFileListUrl($file);
        return implode(',', $result);
    }

    /**
     * 静态资源列表
     * @param $list
     * @param array $fields
     * @return array
     */
    public static function listFile($list, $fields = []): array
    {
        if (!$list) return [];
        if (!$fields) return $list;
        return array_map(function ($value) use ($fields){
            if (is_array($fields)) {
                foreach ($fields as $field) {
                    if (isset($value[$field]) && $value[$field]) {
                        $value[$field] = self::file($value[$field]);
                    }
                }
            } else {
                if (isset($value[$fields]) && $value[$fields]) {
                    $value[$fields] = self::file($value[$fields]);
                }
            }
            return $value;
        }, $list);
    }

    /**
     * 对列表中的id进行加密，以及静态资源
     * @param array $list
     * @param string $idField
     * @return array
     */
    public static function lists(array $list, $idField = 'id'): array
    {
        if (!$list) return [];
        return array_map(function ($value) use ($idField){
            return self::info($value, $idField);
        }, $list);
    }

    /**
     * 对单条信息中的id进行加密，以及静态资源
     * @param array $info
     * @param string $idField
     * @return array
     */
    public static function info(array $info, $idField = 'id'): array
    {
        if ($idField && isset($info[$idField])) $info[$idField] = self::idEn($info[$idField]);
//        if (isset($info['cover'])) $info['cover'] = self::file($info['cover']);
        return $info;
    }


    public static function maskToken($token): string
    {
        $mask = self::$mask;
        if (strlen($mask) > strlen($token)) {
            $token = str_pad($token, strlen($mask),'#');
        } elseif(strlen($token) > strlen($mask) ) {
            $mask = str_pad($mask, strlen($token),'#');
        }
        return StringHelper::base64UrlEncode(($mask ^ $token).$mask);
    }

    public static function unmaskToken(string $maskedToken): string
    {
        $decoded = StringHelper::base64UrlDecode($maskedToken);
        $length = StringHelper::byteLength($decoded) / 2;
        if (!is_int($length)) return '';
        return StringHelper::byteSubstr($decoded, $length, $length) ^ StringHelper::byteSubstr($decoded, 0, $length);
    }
}